// 347.前K个高频元素
package LeetcodeHot100;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Solution347 {
    // public int[] topKFrequent(int[] nums, int k) {
    // // 使用map来存储每个数字出现的频率
    // Map<Integer, Integer> map = new HashMap<>();
    // for (int i = 0; i < nums.length; i++) {
    // map.put(nums[i], map.getOrDefault(nums[i], 0) + 1);
    // }

    // // 使用优先队列构造堆，存储频率为前K的元素，堆顶元素为这K的元素的最小值
    // PriorityQueue<Integer> pq = new PriorityQueue<>(new Comparator<Integer>() {
    // @Override
    // public int compare(Integer a, Integer b) {
    // return map.get(a) - map.get(b);
    // }
    // });

    // // 遍历整个map，存储频率前K个元素
    // for (Integer key : map.keySet()) {
    // if (pq.size() < k)
    // pq.add(key);
    // else if (map.get(key) > map.get(pq.peek())) {
    // pq.poll();
    // pq.add(key);

    // }
    // }

    // // 使用 List 类型存储
    // List<Integer> list = new ArrayList<>();
    // for (Integer i : pq) {
    // list.add(i);
    // }

    // // 将 List 转为 int[]
    // return list.stream().mapToInt(i -> i).toArray();
    // }

    public int[] topKFrequent(int[] nums, int k) {
        // 使用map来存储每个数字出现的频率
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            map.put(nums[i], map.getOrDefault(nums[i], 0) + 1);
        }

        // 桶排序
        @SuppressWarnings("unchecked")
        List<Integer>[] list = new List[nums.length + 1];

        for (Integer key : map.keySet()) {
            int index = map.get(key);
            if (list[index] == null)
                list[index] = new ArrayList<>();
            list[index].add(key);
        }

        // 从后往前遍历获取频率前K个元素
        List<Integer> result = new ArrayList<>();
        for (int i = list.length - 1; i >= 0 && result.size() < k; i--) {
            if (list[i] == null)
                continue;
            result.addAll(list[i]);
        }

        return result.stream().mapToInt(i -> i).toArray();
    }
}
